package p20_mvc初体验;

import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletRegistrationBean;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.DispatcherServlet;

/**
 * DispatcherServlet作为springmvc最重要的一个组件，这节介绍DispatcherServlet的创建和初始化
 */
@Configuration
@ComponentScan  //指定spring扫描路径，默认当前类所在路径及其子路径
@EnableConfigurationProperties({WebMvcProperties.class})    //这里可以将对应配置类放入ioc容器
public class _1_DispatcherServlet初始化时机 {

    public static void main(String[] args) {
        /**
         * ApplicationContext的实现类之一，可以传入并解析配置类，并根据解析到的bean创建一个web服务
         */
        AnnotationConfigServletWebServerApplicationContext context =
                new AnnotationConfigServletWebServerApplicationContext(_1_DispatcherServlet初始化时机.class);
    }

    /**
     * 让容器放入tomcat服务器和前处理器，并把他进行绑定，从而创建一个web服务
     */
    @Bean
    public ServletWebServerFactory servletWebServerFactory(){
        //内嵌web容器工厂，默认端口8080
        return new TomcatServletWebServerFactory();
    }
    @Bean
    public DispatcherServlet dispatcherServlet() {
        //springmvc的前处理器，也是其核心，本质是一个servlet
        //DispatcherServlet的初始化，本质就是执行该类的onRefresh()方法
        return new DispatcherServlet();
    }

    /**
     * 将上面定义的前处理注册到tomcat，并绑定映射路径
     * 在javaweb中一般在web.xml中进行servlet类与路由的映射关系绑定
     * 当然也可以通过编程方式来绑定，下面就演示了如何进行绑定
     */
    @Bean
    public DispatcherServletRegistrationBean registrationBean(DispatcherServlet dispatcherServlet) {
        //将前处理器注册到服务器
        DispatcherServletRegistrationBean bean = new DispatcherServletRegistrationBean(dispatcherServlet, "/");
        //多个servlet，这个数字越小(>0)，初始化优先级就越高
        //默认-1，表示服务器启动时不出时候DispatcherServlet，第一次访问才初始化
        //设为1，表示服务器启动就初始化
        bean.setLoadOnStartup(1);
        //上面的映射路径，和初始化时机数字，一般放在配置文件中，这里不演示了，懂那意思即可
        return bean;
    }

}
